package org.example.myleet.p978;

public class Solution {

    private static final int ASCEND = 1;
    private static final int DESCEND = -1;

    /**
     * 6 ms
     * 双指针法
     */
    public int maxTurbulenceSize(int[] arr) {
        if (arr.length == 1) {
            return 1;
        }
        //l-左指针，r-右指针，t-当前的上升下降状态，t_-前一位的上升下降状态，n-数组长度，maxTurbulenceLen-湍流最大长度
        int l = 0, r = 1, t, t_, n = arr.length, maxTurbulenceLen = 1;
        //初始化，先跳过开头相等的数据
        while (r<n && arr[l] == arr[r]) {
            ++l;
            ++r;
        }
        if (r >= n) {
            //如果到末尾了，就结束
            return maxTurbulenceLen;
        }
        //初始化第一个状态
        t = arr[r-1]>arr[r]?DESCEND:ASCEND;
        while (r<n-1) {
            //右指针向右滑动
            ++r;
            if (arr[r-1] == arr[r]) {
                //如果出现相等的情况，湍流结束，记录l至r-1的最大长度，然后从左指针r开始，跳过相等的数，因为相等的数不能作为湍流开端
                maxTurbulenceLen = Math.max(r-1 - l + 1, maxTurbulenceLen);
                l = r;
                continue;
            }
            t_ = arr[r-1]>arr[r]?DESCEND:ASCEND;
            if (t == t_) {
                //如果出现相同的趋势情况，湍流结束，记录l至r-1的最大长度，然后从左指针r-1开始，因为r至r-1可被用作下一个湍流的开端
                maxTurbulenceLen = Math.max(r-1 - l + 1, maxTurbulenceLen);
                l = r-1;
            }
            //记录上一个趋势
            t = t_;
        }
        //最后到达尾部，检查最终双指针形成的窗口大还是曾经见过的最大湍流更大
        return Math.max(r - l + 1, maxTurbulenceLen);
    }
}
